Generated by Cython 3.0.2

Yellow lines hint at Python interaction.
Click on a line that starts with a "+" to see the C code that Cython generated for it.

Raw output: ccm_helper_functions.c

+01: # cython: infer_types=True, wraparound=False, nonecheck=False, boundscheck=False, cdivision=True, language_level=3, profile=True, autogen_pxd=True
  __pyx_t_7 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_7) < 0) __PYX_ERR(1, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 02: 
+03: import numpy as np
  __pyx_t_7 = __Pyx_ImportDottedModule(__pyx_n_s_numpy, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 3, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_7) < 0) __PYX_ERR(1, 3, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 04: cimport numpy as np
 05: 
 06: 
+07: def check_even_square(np.ndarray image_arr):
/* Python wrapper */
static PyObject *__pyx_pw_7nanopyx_4core_8analysis_20ccm_helper_functions_1check_even_square(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_7nanopyx_4core_8analysis_20ccm_helper_functions_check_even_square, "\n    Function used to check if an image array is an even square.\n    :param image_arr: numpy array with shape (t, y, x)\n    :return: bool, True if an image array is an even square\n    ");
static PyMethodDef __pyx_mdef_7nanopyx_4core_8analysis_20ccm_helper_functions_1check_even_square = {"check_even_square", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7nanopyx_4core_8analysis_20ccm_helper_functions_1check_even_square, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7nanopyx_4core_8analysis_20ccm_helper_functions_check_even_square};
static PyObject *__pyx_pw_7nanopyx_4core_8analysis_20ccm_helper_functions_1check_even_square(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  PyArrayObject *__pyx_v_image_arr = 0;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("check_even_square (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_MACROS
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args);
  if (unlikely((__pyx_nargs < 0))) __PYX_ERR(1, 7, __pyx_L3_error)
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_image_arr,0};
  PyObject* values[1] = {0};
    if (__pyx_kwds) {
      Py_ssize_t kw_args;
      switch (__pyx_nargs) {
        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
      switch (__pyx_nargs) {
        case  0:
        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_image_arr)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 7, __pyx_L3_error)
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t kwd_pos_args = __pyx_nargs;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "check_even_square") < 0)) __PYX_ERR(1, 7, __pyx_L3_error)
      }
    } else if (unlikely(__pyx_nargs != 1)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
    }
    __pyx_v_image_arr = ((PyArrayObject *)values[0]);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("check_even_square", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 7, __pyx_L3_error)
  goto __pyx_L3_error;
  __pyx_L3_error:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_AddTraceback("nanopyx.core.analysis.ccm_helper_functions.check_even_square", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_image_arr), __pyx_ptype_5numpy_ndarray, 1, "image_arr", 0))) __PYX_ERR(1, 7, __pyx_L1_error)
  __pyx_r = __pyx_pf_7nanopyx_4core_8analysis_20ccm_helper_functions_check_even_square(__pyx_self, __pyx_v_image_arr);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7nanopyx_4core_8analysis_20ccm_helper_functions_check_even_square(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_image_arr) {
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_TraceFrameInit(__pyx_codeobj__11)
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("check_even_square", 0);
  __Pyx_TraceCall("check_even_square", __pyx_f[1], 7, 0, __PYX_ERR(1, 7, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_1, 1);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("nanopyx.core.analysis.ccm_helper_functions.check_even_square", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__25 = PyTuple_Pack(1, __pyx_n_s_image_arr); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(1, 7, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__25);
  __Pyx_GIVEREF(__pyx_tuple__25);
/* … */
  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7nanopyx_4core_8analysis_20ccm_helper_functions_1check_even_square, 0, __pyx_n_s_check_even_square, NULL, __pyx_n_s_nanopyx_core_analysis_ccm_helper, __pyx_d, ((PyObject *)__pyx_codeobj__11)); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 7, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_check_even_square, __pyx_t_7) < 0) __PYX_ERR(1, 7, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_codeobj__11 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__25, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_nanopyx_core_analysis_ccm_he, __pyx_n_s_check_even_square, 7, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__11)) __PYX_ERR(1, 7, __pyx_L1_error)
 08:     """
 09:     Function used to check if an image array is an even square.
 10:     :param image_arr: numpy array with shape (t, y, x)
 11:     :return: bool, True if an image array is an even square
 12:     """
+13:     return _check_even_square(image_arr)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_float(((PyObject *)__pyx_v_image_arr), PyBUF_WRITABLE); if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(1, 13, __pyx_L1_error)
  __pyx_t_2 = __pyx_f_7nanopyx_4core_8analysis_20ccm_helper_functions__check_even_square(__pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(1, 13, __pyx_L1_error)
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_1, 1);
  __pyx_t_1.memview = NULL; __pyx_t_1.data = NULL;
  __pyx_t_3 = __Pyx_PyBool_FromLong(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;
 14: 
 15: 
+16: cdef bint _check_even_square(float[:, :, :] image_arr) nogil:
static int __pyx_f_7nanopyx_4core_8analysis_20ccm_helper_functions__check_even_square(__Pyx_memviewslice __pyx_v_image_arr) {
  int __pyx_v_w;
  int __pyx_v_h;
  int __pyx_r;
  __Pyx_TraceDeclarations
  __Pyx_TraceCall("_check_even_square", __pyx_f[1], 16, 1, __PYX_ERR(1, 16, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  #ifdef WITH_THREAD
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  #endif
  __Pyx_AddTraceback("nanopyx.core.analysis.ccm_helper_functions._check_even_square", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  #ifdef WITH_THREAD
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  #endif
  __pyx_L0:;
  __Pyx_TraceReturn(Py_None, 1);
  return __pyx_r;
}
+17:     cdef int w = image_arr.shape[2]
  __pyx_v_w = (__pyx_v_image_arr.shape[2]);
+18:     cdef int h = image_arr.shape[1]
  __pyx_v_h = (__pyx_v_image_arr.shape[1]);
 19: 
+20:     if w != h:
  __pyx_t_1 = (__pyx_v_w != __pyx_v_h);
  if (__pyx_t_1) {
/* … */
  }
+21:         return False
    __pyx_r = 0;
    goto __pyx_L0;
+22:     if w % 2 != 0:
  __pyx_t_1 = ((__pyx_v_w % 2) != 0);
  if (__pyx_t_1) {
/* … */
  }
+23:         return False
    __pyx_r = 0;
    goto __pyx_L0;
 24: 
+25:     return True
  __pyx_r = 1;
  goto __pyx_L0;
 26: 
 27: 
+28: def get_closest_even_square_size(np.ndarray image_arr):
/* Python wrapper */
static PyObject *__pyx_pw_7nanopyx_4core_8analysis_20ccm_helper_functions_3get_closest_even_square_size(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_7nanopyx_4core_8analysis_20ccm_helper_functions_2get_closest_even_square_size, "\n    Function used to calculate the closest even square.\n    :param image_arr: numpy array with shape (t, y, x); image to be cropped\n    :return: int; value of dimensions to be used for cropping\n    ");
static PyMethodDef __pyx_mdef_7nanopyx_4core_8analysis_20ccm_helper_functions_3get_closest_even_square_size = {"get_closest_even_square_size", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7nanopyx_4core_8analysis_20ccm_helper_functions_3get_closest_even_square_size, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7nanopyx_4core_8analysis_20ccm_helper_functions_2get_closest_even_square_size};
static PyObject *__pyx_pw_7nanopyx_4core_8analysis_20ccm_helper_functions_3get_closest_even_square_size(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  PyArrayObject *__pyx_v_image_arr = 0;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("get_closest_even_square_size (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_MACROS
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args);
  if (unlikely((__pyx_nargs < 0))) __PYX_ERR(1, 28, __pyx_L3_error)
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_image_arr,0};
  PyObject* values[1] = {0};
    if (__pyx_kwds) {
      Py_ssize_t kw_args;
      switch (__pyx_nargs) {
        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
      switch (__pyx_nargs) {
        case  0:
        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_image_arr)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 28, __pyx_L3_error)
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t kwd_pos_args = __pyx_nargs;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "get_closest_even_square_size") < 0)) __PYX_ERR(1, 28, __pyx_L3_error)
      }
    } else if (unlikely(__pyx_nargs != 1)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
    }
    __pyx_v_image_arr = ((PyArrayObject *)values[0]);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("get_closest_even_square_size", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 28, __pyx_L3_error)
  goto __pyx_L3_error;
  __pyx_L3_error:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_AddTraceback("nanopyx.core.analysis.ccm_helper_functions.get_closest_even_square_size", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_image_arr), __pyx_ptype_5numpy_ndarray, 1, "image_arr", 0))) __PYX_ERR(1, 28, __pyx_L1_error)
  __pyx_r = __pyx_pf_7nanopyx_4core_8analysis_20ccm_helper_functions_2get_closest_even_square_size(__pyx_self, __pyx_v_image_arr);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7nanopyx_4core_8analysis_20ccm_helper_functions_2get_closest_even_square_size(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_image_arr) {
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_TraceFrameInit(__pyx_codeobj__12)
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("get_closest_even_square_size", 0);
  __Pyx_TraceCall("get_closest_even_square_size", __pyx_f[1], 28, 0, __PYX_ERR(1, 28, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_1, 1);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("nanopyx.core.analysis.ccm_helper_functions.get_closest_even_square_size", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7nanopyx_4core_8analysis_20ccm_helper_functions_3get_closest_even_square_size, 0, __pyx_n_s_get_closest_even_square_size, NULL, __pyx_n_s_nanopyx_core_analysis_ccm_helper, __pyx_d, ((PyObject *)__pyx_codeobj__12)); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 28, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_closest_even_square_size, __pyx_t_7) < 0) __PYX_ERR(1, 28, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
/* … */
  __pyx_codeobj__12 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__25, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_nanopyx_core_analysis_ccm_he, __pyx_n_s_get_closest_even_square_size, 28, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__12)) __PYX_ERR(1, 28, __pyx_L1_error)
 29:     """
 30:     Function used to calculate the closest even square.
 31:     :param image_arr: numpy array with shape (t, y, x); image to be cropped
 32:     :return: int; value of dimensions to be used for cropping
 33:     """
+34:     return _get_closest_even_square_size(image_arr)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_float(((PyObject *)__pyx_v_image_arr), PyBUF_WRITABLE); if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(1, 34, __pyx_L1_error)
  __pyx_t_2 = __pyx_f_7nanopyx_4core_8analysis_20ccm_helper_functions__get_closest_even_square_size(__pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(1, 34, __pyx_L1_error)
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_1, 1);
  __pyx_t_1.memview = NULL; __pyx_t_1.data = NULL;
  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 34, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;
 35: 
 36: 
+37: cdef int _get_closest_even_square_size(float[:, :, :] image_arr) nogil:
static int __pyx_f_7nanopyx_4core_8analysis_20ccm_helper_functions__get_closest_even_square_size(__Pyx_memviewslice __pyx_v_image_arr) {
  int __pyx_v_w;
  int __pyx_v_h;
  int __pyx_v_min_size;
  int __pyx_r;
  __Pyx_TraceDeclarations
  __Pyx_TraceCall("_get_closest_even_square_size", __pyx_f[1], 37, 1, __PYX_ERR(1, 37, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  #ifdef WITH_THREAD
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  #endif
  __Pyx_AddTraceback("nanopyx.core.analysis.ccm_helper_functions._get_closest_even_square_size", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  #ifdef WITH_THREAD
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  #endif
  __pyx_L0:;
  __Pyx_TraceReturn(Py_None, 1);
  return __pyx_r;
}
+38:     cdef int w = image_arr.shape[2]
  __pyx_v_w = (__pyx_v_image_arr.shape[2]);
+39:     cdef int h = image_arr.shape[1]
  __pyx_v_h = (__pyx_v_image_arr.shape[1]);
+40:     cdef int min_size = min(w, h)
  __pyx_t_1 = __pyx_v_h;
  __pyx_t_2 = __pyx_v_w;
  __pyx_t_4 = (__pyx_t_1 < __pyx_t_2);
  if (__pyx_t_4) {
    __pyx_t_3 = __pyx_t_1;
  } else {
    __pyx_t_3 = __pyx_t_2;
  }
  __pyx_v_min_size = __pyx_t_3;
 41: 
+42:     if min_size % 2 != 0:
  __pyx_t_4 = ((__pyx_v_min_size % 2) != 0);
  if (__pyx_t_4) {
/* … */
  }
+43:         min_size -= 1
    __pyx_v_min_size = (__pyx_v_min_size - 1);
 44: 
+45:     return min_size
  __pyx_r = __pyx_v_min_size;
  goto __pyx_L0;
 46: 
 47: 
+48: def make_even_square(np.ndarray image_arr):
/* Python wrapper */
static PyObject *__pyx_pw_7nanopyx_4core_8analysis_20ccm_helper_functions_5make_even_square(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_7nanopyx_4core_8analysis_20ccm_helper_functions_4make_even_square, "\n    Function used to crop an image array into an even square.\n    :param image_arr: numpy array with shape (t, y, x); image to be cropped\n    :return: numpy array with shape (t, y, x)\n    ");
static PyMethodDef __pyx_mdef_7nanopyx_4core_8analysis_20ccm_helper_functions_5make_even_square = {"make_even_square", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7nanopyx_4core_8analysis_20ccm_helper_functions_5make_even_square, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7nanopyx_4core_8analysis_20ccm_helper_functions_4make_even_square};
static PyObject *__pyx_pw_7nanopyx_4core_8analysis_20ccm_helper_functions_5make_even_square(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  PyArrayObject *__pyx_v_image_arr = 0;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("make_even_square (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_MACROS
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args);
  if (unlikely((__pyx_nargs < 0))) __PYX_ERR(1, 48, __pyx_L3_error)
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_image_arr,0};
  PyObject* values[1] = {0};
    if (__pyx_kwds) {
      Py_ssize_t kw_args;
      switch (__pyx_nargs) {
        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
      switch (__pyx_nargs) {
        case  0:
        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_image_arr)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 48, __pyx_L3_error)
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t kwd_pos_args = __pyx_nargs;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "make_even_square") < 0)) __PYX_ERR(1, 48, __pyx_L3_error)
      }
    } else if (unlikely(__pyx_nargs != 1)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
    }
    __pyx_v_image_arr = ((PyArrayObject *)values[0]);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("make_even_square", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 48, __pyx_L3_error)
  goto __pyx_L3_error;
  __pyx_L3_error:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_AddTraceback("nanopyx.core.analysis.ccm_helper_functions.make_even_square", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_image_arr), __pyx_ptype_5numpy_ndarray, 1, "image_arr", 0))) __PYX_ERR(1, 48, __pyx_L1_error)
  __pyx_r = __pyx_pf_7nanopyx_4core_8analysis_20ccm_helper_functions_4make_even_square(__pyx_self, __pyx_v_image_arr);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7nanopyx_4core_8analysis_20ccm_helper_functions_4make_even_square(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_image_arr) {
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_TraceFrameInit(__pyx_codeobj__13)
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("make_even_square", 0);
  __Pyx_TraceCall("make_even_square", __pyx_f[1], 48, 0, __PYX_ERR(1, 48, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_4, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_5, 1);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("nanopyx.core.analysis.ccm_helper_functions.make_even_square", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7nanopyx_4core_8analysis_20ccm_helper_functions_5make_even_square, 0, __pyx_n_s_make_even_square, NULL, __pyx_n_s_nanopyx_core_analysis_ccm_helper, __pyx_d, ((PyObject *)__pyx_codeobj__13)); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 48, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_make_even_square, __pyx_t_7) < 0) __PYX_ERR(1, 48, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 49:     """
 50:     Function used to crop an image array into an even square.
 51:     :param image_arr: numpy array with shape (t, y, x); image to be cropped
 52:     :return: numpy array with shape (t, y, x)
 53:     """
+54:     return np.array(_make_even_square(image_arr))
  __Pyx_XDECREF(__pyx_r);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 54, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_array); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 54, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_float(((PyObject *)__pyx_v_image_arr), PyBUF_WRITABLE); if (unlikely(!__pyx_t_4.memview)) __PYX_ERR(1, 54, __pyx_L1_error)
  __pyx_t_5 = __pyx_f_7nanopyx_4core_8analysis_20ccm_helper_functions__make_even_square(__pyx_t_4); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(1, 54, __pyx_L1_error)
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_4, 1);
  __pyx_t_4.memview = NULL; __pyx_t_4.data = NULL;
  __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_t_5, 3, (PyObject *(*)(char *)) __pyx_memview_get_float, (int (*)(char *, PyObject *)) __pyx_memview_set_float, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 54, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_5, 1);
  __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
  __pyx_t_6 = NULL;
  __pyx_t_7 = 0;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_6)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
      __pyx_t_7 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7);
    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 54, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  }
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 55: 
 56: 
+57: cdef float[:, :, :] _make_even_square(float[:, :, :] image_arr) nogil:
static __Pyx_memviewslice __pyx_f_7nanopyx_4core_8analysis_20ccm_helper_functions__make_even_square(__Pyx_memviewslice __pyx_v_image_arr) {
  int __pyx_v_w;
  int __pyx_v_h;
  int __pyx_v_min_size;
  int __pyx_v_h_start;
  int __pyx_v_h_finish;
  int __pyx_v_w_start;
  int __pyx_v_w_finish;
  __Pyx_memviewslice __pyx_r = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_make_even_square", 1);
  __Pyx_TraceCall("_make_even_square", __pyx_f[1], 57, 1, __PYX_ERR(1, 57, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  #ifdef WITH_THREAD
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  #endif
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_3, 1);
  __pyx_r.data = NULL;
  __pyx_r.memview = NULL;
  __Pyx_AddTraceback("nanopyx.core.analysis.ccm_helper_functions._make_even_square", __pyx_clineno, __pyx_lineno, __pyx_filename);
  goto __pyx_L2;
  __pyx_L0:;
  if (unlikely(!__pyx_r.memview)) {
    #ifdef WITH_THREAD
    PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
    #endif
    PyErr_SetString(PyExc_TypeError, "Memoryview return value is not initialized");
    #ifdef WITH_THREAD
    __Pyx_PyGILState_Release(__pyx_gilstate_save);
    #endif
  }
  #ifdef WITH_THREAD
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  #endif
  __pyx_L2:;
  __Pyx_TraceReturn(Py_None, 1);
  __Pyx_RefNannyFinishContextNogil()
  return __pyx_r;
}
+58:     if _check_even_square(image_arr):
  __pyx_t_1 = __pyx_f_7nanopyx_4core_8analysis_20ccm_helper_functions__check_even_square(__pyx_v_image_arr); if (unlikely(__pyx_t_1 == ((int)-1) && __Pyx_ErrOccurredWithGIL())) __PYX_ERR(1, 58, __pyx_L1_error)
  if (__pyx_t_1) {
/* … */
  }
+59:         return image_arr
    __PYX_INC_MEMVIEW(&__pyx_v_image_arr, 0);
    __pyx_r = __pyx_v_image_arr;
    goto __pyx_L0;
 60: 
+61:     cdef int w = image_arr.shape[2]
  __pyx_v_w = (__pyx_v_image_arr.shape[2]);
+62:     cdef int h = image_arr.shape[1]
  __pyx_v_h = (__pyx_v_image_arr.shape[1]);
+63:     cdef int min_size = _get_closest_even_square_size(image_arr)
  __pyx_t_2 = __pyx_f_7nanopyx_4core_8analysis_20ccm_helper_functions__get_closest_even_square_size(__pyx_v_image_arr); if (unlikely(__pyx_t_2 == ((int)-1) && __Pyx_ErrOccurredWithGIL())) __PYX_ERR(1, 63, __pyx_L1_error)
  __pyx_v_min_size = __pyx_t_2;
 64:     cdef int h_start, h_finish, w_start, w_finish
 65: 
+66:     h_start = (h-min_size)//2
  __pyx_v_h_start = ((__pyx_v_h - __pyx_v_min_size) / 2);
+67:     if (h-min_size) % 2 != 0:
  __pyx_t_1 = (((__pyx_v_h - __pyx_v_min_size) % 2) != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L4;
  }
+68:         h_finish = h - (h-min_size) // 2 - 1
    __pyx_v_h_finish = ((__pyx_v_h - ((__pyx_v_h - __pyx_v_min_size) / 2)) - 1);
 69:     else:
+70:         h_finish = h - (h-min_size) // 2
  /*else*/ {
    __pyx_v_h_finish = (__pyx_v_h - ((__pyx_v_h - __pyx_v_min_size) / 2));
  }
  __pyx_L4:;
 71: 
+72:     w_start = int((w-min_size)/2)
  __pyx_v_w_start = ((int)(((long)(__pyx_v_w - __pyx_v_min_size)) / 2));
+73:     if (w - min_size) % 2 != 0:
  __pyx_t_1 = (((__pyx_v_w - __pyx_v_min_size) % 2) != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L5;
  }
+74:         w_finish = w - (w-min_size) // 2 - 1
    __pyx_v_w_finish = ((__pyx_v_w - ((__pyx_v_w - __pyx_v_min_size) / 2)) - 1);
 75:     else:
+76:         w_finish = w - (w-min_size) // 2
  /*else*/ {
    __pyx_v_w_finish = (__pyx_v_w - ((__pyx_v_w - __pyx_v_min_size) / 2));
  }
  __pyx_L5:;
 77: 
+78:     return image_arr[:, h_start:h_finish, w_start:w_finish]
  __pyx_t_3.data = __pyx_v_image_arr.data;
  __pyx_t_3.memview = __pyx_v_image_arr.memview;
  __PYX_INC_MEMVIEW(&__pyx_t_3, 0);
  __pyx_t_3.shape[0] = __pyx_v_image_arr.shape[0];
__pyx_t_3.strides[0] = __pyx_v_image_arr.strides[0];
    __pyx_t_3.suboffsets[0] = -1;

__pyx_t_2 = -1;
  if (unlikely(__pyx_memoryview_slice_memviewslice(
    &__pyx_t_3,
    __pyx_v_image_arr.shape[1], __pyx_v_image_arr.strides[1], __pyx_v_image_arr.suboffsets[1],
    1,
    1,
    &__pyx_t_2,
    __pyx_v_h_start,
    __pyx_v_h_finish,
    0,
    1,
    1,
    0,
    1) < 0))
{
    __PYX_ERR(1, 78, __pyx_L1_error)
}

if (unlikely(__pyx_memoryview_slice_memviewslice(
    &__pyx_t_3,
    __pyx_v_image_arr.shape[2], __pyx_v_image_arr.strides[2], __pyx_v_image_arr.suboffsets[2],
    2,
    2,
    &__pyx_t_2,
    __pyx_v_w_start,
    __pyx_v_w_finish,
    0,
    1,
    1,
    0,
    1) < 0))
{
    __PYX_ERR(1, 78, __pyx_L1_error)
}

__pyx_r = __pyx_t_3;
  __pyx_t_3.memview = NULL;
  __pyx_t_3.data = NULL;
  goto __pyx_L0;